#include"process.h"
#include<time.h>
#include<stdlib.h>
//实际应用场景：网络下载软件
double total=1024.0;
double speed =1.0;
//version3
//相较于version2，这也是一种特殊的代码
//实际业务的时候，这种方法可以复用，代码维护性较好
//函数指针

typedef void (*callback_t)(double,double);

//网络浮动
//              基本网速      浮动网速
double speedfloat(double start,double range)//示例(1.0,3.0)->[1.0,4.0]
{
    int int_range=(int)range;
    return start + rand()%int_range + (range + int_range); 
}
//cb：回调函数
void download(int total,callback_t cd)
{
  srand(time(NULL));
  double cur=0.0;
  while(1)//(cur<=total)
  {
    if(cur>total)
    {
      cur=total;//模拟下载完成
      cd(total,cur);//更新进度：按照下载进度更新进度
      break;
    }

    cd(total,cur);//更新进度:按照下载进度更新进度
    //cur+=speed;//模拟下载行为
    cur+=speedfloat(speed,30.3);
    
    usleep(30000);
  }
}
int main()
{
  //process();
  printf("download:1000MB:\n");
  download(1000,flashprocess); 
  printf("download:20MB:\n");
  download(20,flashprocess);
  printf("download:1GB:\n");
  download(1024,flashprocess);
  printf("download:56MB:\n");
  download(56,flashprocess);
  return 0;
}
//version2：耦合性太强，不适合实际应用
////网络浮动
////              基本网速      浮动网速
//double speedfloat(double start,double range)//示例(1.0,3.0)->[1.0,4.0]
//{
//    int int_range=(int)range;
//    return start + rand()%int_range + (range + int_range); 
//}
////网络浮动
////              基本网速      浮动网速
//double speedfloat(double start,double range)//示例(1.0,3.0)->[1.0,4.0]
//{
//    int int_range=(int)range;
//    return start + rand()%int_range + (range + int_range); 
//}
//void download(int total)
//{
//  srand(time(NULL));
//  double cur=0.0;
//  while(1)//(cur<=total)
//  {
//    if(cur>total)
//    {
//      cur=total;//模拟下载完成
//      flashprocess(total,cur);//更新进度：按照下载进度更新进度
//      break;
//    }
//
//    flashprocess(total,cur);//更新进度:按照下载进度更新进度
//    //cur+=speed;//模拟下载行为
//    cur+=speedfloat(speed,30.3);
//    
//    usleep(30000);
//  }
//}
//int main()
//{
//  //process();
//  printf("download:1000MB:\n");
//  download(1000); 
//  printf("download:20MB:\n");
//  download(20);
//  printf("download:1GB:\n");
//  download(1024);
//  printf("download:56MB:\n");
//  download(56);
//  return 0;
//}
